﻿Imports Microsoft.DirectX
Imports Microsoft.DirectX.Direct3D
Imports Commander_Wars.Spieletools
''' <summary>
''' Eine Landkarte zur Auswahl bei Kampagnen Spielen
''' (Nicht fuer aehnlich wie bei Schlacht um Mittelerde II)
''' </summary>
''' <remarks></remarks>
Public Class ObjektKartenauswahlLandkartenMenue
    Inherits ObjektFormMenue

    Public LandkartenInfo As ObjektLandkartenInfos = Nothing

    Dim Landkarte As Bitmap
    Dim LandkartenTextur As Texture
    Dim Landkartenteile As Bitmap() = {}
    Dim WasserTextur As Texture
    Dim WasserTexturBreite As Integer
    Dim LandkartenteileTexturen As Texture() = {}
    Dim LandkartenteileTexturenAusgewaehlt As Texture() = {}
    Dim TexturSieg, TexturVerloren As Texture
    Public AusgewaehlteMission As Integer = -1
    Dim AusgewaehlterMissionsName As String = ""
    Dim Karte As ObjektSpielfeld
    Public Const Symbolbreite As Integer = 31

    Public KooX, KooY As Integer
    Dim ScrollX, ScrollY As Integer
    Dim Scrollen As Boolean = False

    Public Sub New(ByVal LandkarteniniPfad As String)
        MyBase.New()
        Dim Pfad As String = LandkarteniniPfad.Remove(LandkarteniniPfad.LastIndexOf("\")) + "\"
        LandkartenInfo = New ObjektLandkartenInfos(LandkarteniniPfad)
        LandkartenInfo.KampagnenOrdner = Pfad
        MissionsBilderLaden()
        If Landkarte Is Nothing Then
            KooX = DataSettings.BildschirmBreite / 2
            KooY = DataSettings.BildschirmHoehe / 2
        Else
            KooX = DataSettings.BildschirmBreite / 2 - Landkarte.Width / 2
            KooY = DataSettings.BildschirmHoehe / 2 - Landkarte.Height / 2
        End If


        ResetButton() 'So erstmal keine Buttons.
        NeuButton(30, DataSettings.BildschirmHoehe - 30, DataSettings.Resourcenpfad + "Objects\Button.png", "Beenden", New PointF(0, 1))
    End Sub
    Public Sub New(ByVal LandkartenInfo As ObjektLandkartenInfos)
        MyBase.New()
        Me.LandkartenInfo = LandkartenInfo
        MissionsBilderLaden()
        KooX = DataSettings.BildschirmBreite / 2 - Landkarte.Width / 2
        KooY = DataSettings.BildschirmHoehe / 2 - Landkarte.Height / 2

        ResetButton() 'So erstmal keine Buttons.
        NeuButton(30, DataSettings.BildschirmHoehe - 30, DataSettings.Resourcenpfad + "Objects\Button.png", "Beenden", New PointF(0, 1))
    End Sub

    Private Sub MissionsBilderLaden()
        TexturSieg = Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Worldmap\SymbolSieg.png")
        TexturVerloren = Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Worldmap\SymbolNiederlage.png")
        If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "Worldmap\" + LandkartenInfo.HintergrundsBild + ".png") Then
            Landkarte = Image.FromFile(DataSettings.Resourcenpfad + "Worldmap\" + LandkartenInfo.HintergrundsBild + ".png")
        End If
        LandkartenTextur = Grafikengine.LoadTexture(Landkarte)
        Array.Resize(Landkartenteile, LandkartenInfo.Missionen.Length)
        Array.Resize(LandkartenteileTexturen, LandkartenInfo.Missionen.Length)
        Array.Resize(LandkartenteileTexturenAusgewaehlt, LandkartenInfo.Missionen.Length)

        Dim bmp As Bitmap = Image.FromFile(DataSettings.Resourcenpfad + "Worldmap\HintergrundWasser.png")
        WasserTextur = Grafikengine.LoadTexture(bmp)
        WasserTexturBreite = bmp.Width

        For I = 0 To LandkartenInfo.Missionen.Length - 1
            Landkartenteile(I) = Image.FromFile(DataSettings.Resourcenpfad + "Worldmap\Komprimiert\" + LandkartenInfo.Missionen(I).getBildname + ".png")
            LandkartenteileTexturen(I) = Grafikengine.LoadTexture(Landkartenteile(I))
            LandkartenteileTexturenAusgewaehlt(I) = Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Worldmap\Komprimiert\" + LandkartenInfo.Missionen(I).getBildname(True) + ".png")
        Next

    End Sub

    Public Overrides Sub Frame()

    End Sub

    Public Overrides Sub IniMenue()

    End Sub

    Public Overrides Sub KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)
        Select Case e.KeyCode
            Case Keys.Escape
                Hauptmenue.Ini(Hauptmenue.Formmodi.Hauptmenue)
            Case DataSettings.Bestaetigen
                If Landkarte Is Nothing Then
                    KooX = DataSettings.BildschirmBreite / 2
                    KooY = DataSettings.BildschirmHoehe / 2
                Else
                    KooX = DataSettings.BildschirmBreite / 2 - Landkarte.Width / 2
                    KooY = DataSettings.BildschirmHoehe / 2 - Landkarte.Height / 2
                End If
            Case Else
                KeyDownObjekte(sender, e)
        End Select
    End Sub

    Public Overrides Sub Malen()
        Dim sngrotation As Single = 0
        Dim intcolor As Color = Color.FromArgb(255, 255, 255, 255)
        Grafikengine.szfScale = Nothing
        Grafikengine.ptfRotCenter = New Point
        Grafikengine.recBild = Nothing

        For X = 0 To DataSettings.BildschirmBreite - 1 Step WasserTexturBreite
            For Y = 0 To DataSettings.BildschirmHoehe - 1 Step WasserTexturBreite
                Grafikengine.ptfPosition = New Point(X, Y)
                Grafikengine.Sprite.Draw2D(WasserTextur, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngrotation, Grafikengine.ptfPosition, intcolor)
            Next
        Next
        Grafikengine.ptfPosition = New Point(KooX, KooY)
        If LandkartenTextur IsNot Nothing Then
            Grafikengine.Sprite.Draw2D(LandkartenTextur, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngrotation, Grafikengine.ptfPosition, intcolor)
        End If
        For I = 0 To LandkartenteileTexturen.Length - 1
            'Die Landkarte malen.
            intcolor = LandkartenInfo.Missionen(I).getIntColor
            Grafikengine.ptfPosition.X = KooX + LandkartenInfo.Missionen(I).getBildKooX
            Grafikengine.ptfPosition.Y = KooY + LandkartenInfo.Missionen(I).getBildKooY

            Grafikengine.Sprite.Draw2D(LandkartenteileTexturen(I), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngrotation, Grafikengine.ptfPosition, intcolor)
            If I = AusgewaehlteMission Then 'und evtl. noch einen Fokus setzen.
                intcolor = LandkartenInfo.Missionen(I).getIntColor(True)
                If LandkartenteileTexturenAusgewaehlt(I) IsNot Nothing Then
                    Grafikengine.Sprite.Draw2D(LandkartenteileTexturenAusgewaehlt(I), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngrotation, Grafikengine.ptfPosition, intcolor)
                End If
            End If
            Select Case LandkartenInfo.Missionen(I).MissionsZustand
                Case Mission.MissionsZustaende.Gewonnen
                    Grafikengine.ptfPosition.X = KooX + LandkartenInfo.Missionen(I).getBildKooX(True) - Symbolbreite / 2
                    Grafikengine.ptfPosition.Y = KooY + LandkartenInfo.Missionen(I).getBildKooY(True) - Symbolbreite / 2
                    intcolor = Color.FromArgb(255, 255, 255, 255) 'Die Symbole werden ganz normal gemalt.
                    Grafikengine.Sprite.Draw2D(TexturSieg, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngrotation, Grafikengine.ptfPosition, intcolor)
                Case Mission.MissionsZustaende.Verloren
                    Grafikengine.ptfPosition.X = KooX + LandkartenInfo.Missionen(I).getBildKooX(True) - Symbolbreite / 2
                    Grafikengine.ptfPosition.Y = KooY + LandkartenInfo.Missionen(I).getBildKooY(True) - Symbolbreite / 2
                    intcolor = Color.FromArgb(255, 255, 255, 255) 'Die Symbole werden ganz normal gemalt.
                    Grafikengine.Sprite.Draw2D(TexturVerloren, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngrotation, Grafikengine.ptfPosition, intcolor)
            End Select
        Next
        If AusgewaehlteMission >= 0 Then
            Dim Name As String = AusgewaehlterMissionsName
            Dim X As Integer = DataSettings.BildschirmBreite / 2 - Name.Length * ObjektAlphabet.BuchstabenBreite
            ObjektAlphabet.DrawString(Name, 1, New Point(X, 20), 2)
        End If
        ObjekteMalen()
        If Not ObjektKODialog.AktuellerDialog Is Nothing Then
            If ObjektKODialog.AktuellerDialog.Malen = True Then
                ObjektKODialog.AktuellerDialog.Loeschen()
            End If
        End If
    End Sub

    Public Overrides Sub MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        If ObjektKODialog.EingabenAngenommen Then Exit Sub
        Select Case e.Button
            Case MouseButtons.Left
                checkMouseDownObjekte(e.X, e.Y)
            Case MouseButtons.Middle
                ScrollX = e.Location.X
                ScrollY = e.Location.Y
                Scrollen = True
        End Select
    End Sub

    Public Overrides Sub MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        MouseMoveObjekte(e.X, e.Y)
        If Scrollen Then
            'na dann, einfach den Bildschirm verschieben.
            KooX += e.X - ScrollX
            KooY += e.Y - ScrollY
            ScrollX = e.X
            ScrollY = e.Y
        End If
    End Sub

    Public Overrides Sub MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        If ObjektKODialog.EingabenAngenommen Then Exit Sub
        If ObjektKODialog.AktuellerDialog Is Nothing Then
            Select Case e.Button
                Case MouseButtons.Left
                    'Erstmal Knoepfe und so abfragen...
                    Dim Funktion As String = checkMouseUPObjekte(e.X, e.Y)
                    Select Case Funktion.ToLower
                        Case "beenden"
                            Hauptmenue.Ini(Hauptmenue.Formmodi.Hauptmenue)
                        Case "mission beginnen!"
                            'Starten Juhuu!!
                            KarteStartbereit()
                        Case ""
                            'So man hat nichts ausgewaehlt.
                            'vielleicht hat man sich ja auf eine Karte geeinigt.
                            KarteAuswaehlen(e.X, e.Y)
                    End Select
                Case MouseButtons.Middle
                    Scrollen = False
            End Select
        End If
    End Sub

    Public Overrides Sub MouseWheel(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)

    End Sub

    Public Overrides Sub SetMausBild()
        ObjektMaus.Zustand = ObjektMaus.Zustaende.Menue
    End Sub

    Public Overrides Sub SprachEingabe(ByVal Eingabe As String)

    End Sub


    Sub KarteAuswaehlen(ByVal KooX As Integer, ByVal KooY As Integer)
        If ObjektKODialog.AktuellerDialog Is Nothing Then
            'Wichtig!
            'Ich gehe davon aus, dass das Bild nicht gestreckt ist, mit anderen Worten, ich vergleiche Die Entsprechenden Pixel
            KooX -= Me.KooX 'Die Position des Bildschirms wird errechnet.
            KooY -= Me.KooY
            Dim LetzteMission As Integer = AusgewaehlteMission
            AusgewaehlteMission = -1 'Wenn wir nichts finden, haben wir auch nichts ausgewaehlt.
            For I = Landkartenteile.Length - 1 To 0 Step -1
                Dim KoordinateX As Integer = KooX - LandkartenInfo.Missionen(I).getBildKooX
                Dim KoordinateY As Integer = KooY - LandkartenInfo.Missionen(I).getBildKooY
                If KoordinateX < 0 Then Continue For
                If KoordinateY < 0 Then Continue For
                If KoordinateX >= Landkartenteile(I).Width Then Continue For
                If KoordinateY >= Landkartenteile(I).Height Then Continue For
                'OK, wir scheinen im Rahmen zu sein.... jetzt kanns richtig losgehen :)
                If Landkartenteile(I).GetPixel(KoordinateX, KoordinateY).A > 1 Then
                    If LandkartenInfo.Missionen(I).isAuswaehlbar Then
                        'Wir malen das Bild, wenn auch vielleicht ein bischen schwach.
                        AusgewaehlteMission = I 'Gefunden!!!
                        Exit For
                    End If
                End If
            Next

            ResetButton() 'So erstmal keine Buttons.
            NeuButton(30, DataSettings.BildschirmHoehe - 30, DataSettings.Resourcenpfad + "Objects\Button.png", "Beenden", New PointF(0, 1))
            If AusgewaehlteMission = -1 Then
                'Nichts ausgewaehlt

            Else
                'Etwas Ausgewaehlt
                NeuButton(DataSettings.BildschirmBreite - 130, DataSettings.BildschirmHoehe - 30, DataSettings.Resourcenpfad + "Objects\Button.png", "Mission beginnen!", New PointF(1, 1))
                If LetzteMission <> AusgewaehlteMission Then
                    KartenAuswahlEreignisse()
                End If
            End If
        End If
    End Sub

    Sub KartenAuswahlEreignisse()
        If AusgewaehlteMission < 0 Then
            AusgewaehlterMissionsName = ""
        Else
            AusgewaehlterMissionsName = LandkartenInfo.Missionen(AusgewaehlteMission).Missionsname
            If My.Computer.FileSystem.FileExists(LandkartenInfo.KampagnenOrdner + LandkartenInfo.Missionen(AusgewaehlteMission).Missionsname + ".ini") Then
                DialogTextSprachKonverter.Reset()
                Dim strR As New IO.StreamReader(LandkartenInfo.KampagnenOrdner + LandkartenInfo.Missionen(AusgewaehlteMission).Missionsname + ".ini", Hauptmenue.Codierung)
                While Not strR.EndOfStream
                    Dim z As String = strR.ReadLine
                    z = z.Trim
                    If z = "" Then Continue While 'Leerzeilen ignorieren
                    If z.StartsWith("'") Then Continue While

                    If z.ToLower.StartsWith("dialog:") Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        Dim s() As String = z.Split("|")
                        Dim Chat As String = ""
                        For i = 3 To s.Length - 2
                            Chat += s(i) + "|"
                        Next
                        Chat += s(s.Length - 1)
                        Dim Ausdruck As ObjektKOTextZeile.KOGesichtsAusdruck = CInt(s(2))
                        ObjektKODialog.NeuerDialog(New ObjektKODialog.KOText() {New ObjektKODialog.KOText(s(0), Chat, CInt(s(1) - 1), Ausdruck)})
                        Continue While
                    End If
                    If z.ToLower.StartsWith("Dialog2:".ToLower) Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        Dim s() As String = z.Split("|")
                        Dim Chat As String = ""
                        For i = 5 To s.Length - 2
                            Chat += s(i) + "|"
                        Next
                        Chat += s(s.Length - 1)
                        Dim Ausdruck As ObjektKOTextZeile.KOGesichtsAusdruck = CInt(s(2))
                        ObjektKODialog.NeuerDialog(New ObjektKODialog.KOText() {New ObjektKODialog.KOText(s(0), Chat, CInt(s(1) - 1), Ausdruck, , s(3), s(4))})
                        Continue While
                    End If
                    If z.Trim.StartsWith("%") Then
                        'hm.. eine Sprach...
                        Dim s() As String = z.Split("%")
                        DialogTextSprachKonverter.SprachKonvIni.AddEintrag(s(1), s(3), s(2))
                    End If
                    If z.ToLower.StartsWith("name:") Then
                        AusgewaehlterMissionsName = z.Remove(0, z.IndexOf(":") + 1)
                    End If
                End While
                strR.Dispose()
            End If
        End If
    End Sub

    ''' <summary>
    ''' Faengt den Start der ausgewaehlten Karte an. Sie wird geladen und entweder gleich (per Ini gestartet) oder man muss noch einstellungen treffen.
    ''' </summary>
    ''' <remarks></remarks>
    Sub KarteStartbereit()
        If AusgewaehlteMission = -1 Then Exit Sub 'Sowas brauchen wir hier gar nicht!

        'Ladebildschirm
        Hauptmenue.Pause = True
        While Grafikengine.IsDrawing
            Threading.Thread.Sleep(ThreadSleepTime)
        End While
        Dim LB As New ObjektLadebildschirm(2, "", LandkartenInfo.KampagnenOrdner + LandkartenInfo.Missionen(AusgewaehlteMission).Missionsname, True, ".map", True, False)


        KarteStarten()
    End Sub
    ''' <summary>
    ''' Startet das Spiel, jetzt ist es fuer Aenderungen zu spaet, ausser Inline Patching :)
    ''' </summary>
    ''' <remarks></remarks>
    Sub KarteStarten()
        'Wir blockieren bestimmte Truppen
        For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
            For I2 = 0 To LandkartenInfo.BlockierteEinheiten.Length - 1
                If Objektverwalter.Spielfeld.Spieler(I).Armee = LandkartenInfo.BlockierteEinheiten(I2).Armee Then
                    'Jetzt kann man die nicht mehr bauen.
                    If Objektverwalter.Spielfeld.Spieler(I).GetBauliste Is Nothing Then
                        Objektverwalter.Spielfeld.Spieler(I).SetBauliste(New Bauliste(ObjektLadeklasse.GetBauliste(Baulisten.CoW)))
                    End If
                    Objektverwalter.Spielfeld.Spieler(I).GetBauliste.AddWert(LandkartenInfo.BlockierteEinheiten(I2).EinheitenID, 0)
                End If
            Next
        Next

        '  Objektverwalter.Spielfeld.Regeln = NeueRegeln
        Hauptmenue.Ini(Hauptmenue.Formmodi.Spiel, , True)
    End Sub
    Public Overrides Sub ChangeWindowSize(ByVal PosChange As System.Drawing.Point)
        MyBase.ChangeWindowSizeObjekte(PosChange)
        KooX += PosChange.X * 0.5#
        KooY += PosChange.Y * 0.5#
    End Sub

    Public Overrides Sub Reset()
        MyBase.Reset()
        LandkartenTextur.Dispose()
        LandkartenTextur = Nothing
        For I = 0 To LandkartenteileTexturen.Length - 1
            LandkartenteileTexturen(I).Dispose()
            LandkartenteileTexturen(I) = Nothing
        Next
        For i = 0 To LandkartenteileTexturenAusgewaehlt.Length - 1
            LandkartenteileTexturenAusgewaehlt(i).Dispose()
            LandkartenteileTexturenAusgewaehlt(i) = Nothing
        Next
        WasserTextur.Dispose()
        WasserTextur = Nothing
        TexturSieg.Dispose()
        TexturSieg = Nothing
        TexturVerloren.Dispose()
        TexturVerloren = Nothing
        Grafikengine.Grafikkarte.EvictManagedResources()
    End Sub

    Public Overrides Sub KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)

    End Sub
End Class
